﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;

namespace Util
{
    public class BeanUtil
    {

        private static PropertyInfo Find(PropertyInfo[] 속성목록, PropertyInfo 속성)
        {
            foreach (var p in 속성목록) {
                if (p.Name .Equals(속성.Name)) {
                    if (p.PropertyType.Equals(속성.PropertyType))
                        return p;
                    return null;
                }
            }
            return null;
        }

        public static void 속성복사(object 소스, object 타겟, string 복사제외속성 = null)
        {
            var 목록 = 복사제외속성 != null ? 복사제외속성.Split(',') : null;
            속성복사(소스, 타겟, false, false, 목록);
        }

        public static void 속성복사(object 소스, object 타겟, bool 널아닌소스속성만, bool 널인타겟속성만, ICollection<string> 복사제외속성목록 = null)
        {
            var 소스속성목록 = 소스.GetType().GetProperties();
            var 타겟속성목록 = 타겟.GetType().GetProperties();

            foreach (var 소스속성 in 소스속성목록) {
                if (복사제외속성목록 != null && 복사제외속성목록.Contains(소스속성.Name)) continue;
                if (소스속성.GetCustomAttributes(typeof(System.Data.Linq.Mapping.AssociationAttribute), false).Length > 0) continue;

                var 타겟속성 = Find(타겟속성목록, 소스속성);
                if (타겟속성 == null) continue;

                var 소스값 = 소스속성.GetValue(소스, null);
                var 타겟값 = 타겟속성.GetValue(타겟, null);

                if (널아닌소스속성만 && 소스값 == null) continue;
                if (널인타겟속성만 && 타겟값 != null) continue;

                타겟속성.SetValue(타겟, 소스값, null);
            }
        }

        public static void SetProperties(object obj, string propertyName, object value)
        {
            var property = obj.GetType().GetProperty(propertyName);
            if (property == null) return;
            property.SetValue(obj, value, null);
        }

        public static object GetProperties(object obj, string propertyName)
        {
            var property = obj.GetType().GetProperty(propertyName);
            if (property == null) return null;
            return property.GetValue(obj, null);
        }

    }
}